//给定四个整数 sx , sy ，tx 和 ty，如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty)，则返回 true，否则返回 
//false。 
//
// 从点 (x, y) 可以转换到 (x, x+y) 或者 (x+y, y)。 
//
// 
//
// 示例 1: 
//
// 
//输入: sx = 1, sy = 1, tx = 3, ty = 5
//输出: true
//解释:
//可以通过以下一系列转换从起点转换到终点：
//(1, 1) -> (1, 2)
//(1, 2) -> (3, 2)
//(3, 2) -> (3, 5)
// 
//
// 示例 2: 
//
// 
//输入: sx = 1, sy = 1, tx = 2, ty = 2 
//输出: false
// 
//
// 示例 3: 
//
// 
//输入: sx = 1, sy = 1, tx = 1, ty = 1 
//输出: true
// 
//
// 
//
// 提示: 
//
// 
// 1 <= sx, sy, tx, ty <= 10⁹ 
// 
// Related Topics 数学 👍 129 👎 0

package leetcode.editor.cn;

public class _780_ReachingPoints {
    public static void main(String[] args) {
        Solution solution = new _780_ReachingPoints().new Solution();
//        int sx = 35;
//        int sy = 13;
//        int tx = 455955547;
//        int ty = 420098884;
        int sx = 1;
        int sy = 1;
        int tx = 1000000000;
        int ty = 1;
        System.out.println(solution.reachingPoints(sx, sy, tx, ty));
    }

    class Solution {
        public boolean reachingPoints(int sx, int sy, int tx, int ty) {
            while (tx != ty && tx > sx && ty > sy) {
                if (tx > ty) {
                    tx %= ty;
                } else {
                    ty %= tx;
                }
            }
            if (sx == tx && sy == ty) return true;
            if (tx == sx) return ty > sy && (ty-sy) % tx == 0;
            if (ty == sy) return tx > sx && (tx-sx) % ty == 0;
            return false;
        }
    }

    /**
     * 有错
     */
    class Solution2 {
        public boolean reachingPoints(int sx, int sy, int tx, int ty) {
            if (sx == tx && sy == ty) return true;
            if (tx == ty || tx < sx || ty < sy) {
                return false;
            }
            boolean flag1 = false;
            boolean flag2 = false;
            if (tx > ty) {
                flag1 = reachingPoints(sx, sy, tx-ty, ty);
            } else {
                flag2 = reachingPoints(sx, sy, tx, ty-tx);
            }
            return flag1 || flag2;
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * 有错
     */
    class Solution1 {
        public boolean reachingPoints(int sx, int sy, int tx, int ty) {
            if (sx == tx && sy == ty) return true;

            if (sx > tx) return false;
            if (sy > ty) return false;

            boolean flag1 = reachingPoints(sx + sy, sy, tx, ty);
            boolean flag2 = reachingPoints(sx, sy + sx, tx, ty);
            return flag1 || flag2;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}